#pragma once

#include<iostream>
#include<string>
#include<cstdio>
#include<sys/types.h>
#include<unistd.h>
#include<signal.h>
#include<sys/stat.h>
#include<fcntl.h>
#include"Log.hpp"
#include"Common.hpp"

using namespace LogModule;
const std::string dev = "/dev/null";

//将服务进行守护进程化
void Daemon(int nochdir,int noclose)
{
    //1.忽略IO，子进程退出等相关的信号
    signal(SIGPIPE,SIG_IGN);
    signal(SIGCHLD,SIG_IGN);

    //2.父进程直接结束
    if(fork()>0) exit(0);

    //3.只能是子进程，孤儿，父进程就是1
    setsid();//创建一个独立的会话

    if(nochdir==0) chdir("/");//更改工作路径

    //守护进程不从键盘输入，也不需要向显示器打印
    //方法一：关闭0,1,2
    //方法二：打开/dev/null,重定向标准输出，标准输入，标准错误到/dev/null
    if(noclose==0)
    {
        int fd = ::open(dev.c_str(),O_RDWR);
        if(fd<0)
        {
            LOG(LogLevel::FATAL)<<"open"<<dev<<"error";
            exit(OPEN_ERR);
        }
        else
        {
            dup2(fd,0);
            dup2(fd,1);
            dup2(fd,2);
            close(fd);
        }
    }
}